#include <iostream>
#include <string>
#include <vector>
using namespace std;
/*动态规划数组 dp 是个不错的选择，因为每个台阶的最优解都依赖于之前台阶的结果。
算法步骤大概是这样：

1.初始化 dp 数组的前两个元素 dp[0] 和 dp[1]，
    分别表示从第 0 个和第 1 个台阶开始的初始花费。
2.从第 2 个台阶开始，依次计算每个台阶的最低花费。
    对于第 i 个台阶，它可以从前一个台阶（i - 1）花费
    dp[i - 1] 再加上当前台阶 cost[i] 到达，也可以从前两个台阶（i - 2）花费 dp[i
- 2] 再加上当前台阶 cost[i] 到达。我们取这两种情况中的最小值，作为 dp[i] 的值。
3.最后，整个 dp 数组中的最后两个元素 dp[n - 1] 和
    dp[n - 2] 中的最小值就是到达楼梯顶部的最低花费。
*/
int get_cost(const vector<int> &cost, int n) {
  vector<int> dp(cost.size(), 0);
  dp[0] = cost[0];
  if (n > 1)
    dp[1] = cost[1];
  for (int i = 2; i < cost.size(); i++) {
    dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
  }
  for (auto &e : dp)
    cout << e << " ";
  cout << endl;
  return min(dp[cost.size() - 1], dp[cost.size() - 2]);
}
int main() {
  int n = 0;
  cin >> n;
  vector<int> cost(n, 0);
  for (int i = 0; i < n; i++)
    cin >> cost[i];
  int res = get_cost(cost, n);
  cout << res << endl;
  return 0;
}


/*# 问题描述

给定一个整数数组cost，其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用，下标从0开始。一旦你支付此费用，即可选择向上爬一个或者两个台阶。

你可以选择从下标为0或下标为1的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

数据范围：数组长度满足 $ 1≤n≤10² $，数组中的值满足 $ 1≤costi≤10^4 $
# 输入格式

第一行输入一个正整数n，表示数组cost的长度。
第二行输入n个正整数，表示数组cost的值。
# 输出格式

输出最低花费

# 示例1

输入
3
2 5 20

输出
5

说明
你将从下标为1的台阶开始，支付5，向上爬两个台阶，到达楼梯顶部。总花费为5*/